package com.pd.dong.generate.vtl;

import com.pd.dong.generate.common.Constants;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.File;
import java.io.StringWriter;
import java.util.List;
import java.util.Properties;

/**
 * @author dongpeng32
 * @time 2020/10/22
 */
public class VelocityUtils {

    /**
     * 初始化vm方法
     */
    static {
        Properties p = new Properties();
        // 加载classpath目录下的vm文件
        p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        // 定义字符集
        p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
        // 初始化Velocity引擎，指定配置Properties
        Velocity.init(p);
    }


    /**
     * 设置上下文参数
     * @param context
     * @param generatorInfo
     */
    private static void setVelocityContext(VelocityContext context, GeneratorInfo generatorInfo) {
        context.put("obj", generatorInfo);
    }


    /**
     * 生成代码
     */
    public static void  generateCode(GeneratorInfo generatorInfo) {

        VelocityContext velocityContext = new VelocityContext();
        setVelocityContext(velocityContext, generatorInfo);

        List<String> templateName = VelocityConfig.getTemplateList();
        for(String tpt : templateName) {
            Template template =  Velocity.getTemplate(tpt);

            StringWriter sw = new StringWriter();
            template.merge(velocityContext,sw);

            System.out.println(sw);
            String path = getGenPath(table, template);
            FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
        }

    }

    /**
     * 获取代码生成地址
     *
     * @param table 业务表信息
     * @param template 模板文件路径
     * @return 生成地址
     */
    public static String getGenPath(GenTable table, String template)
    {
        String genPath = table.getGenPath();
        if (StringUtils.equals(genPath, "/"))
        {
            return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
        }
        return genPath + File.separator + VelocityUtils.getFileName(template, table);
    }

}
